import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
// http 请求方法
const METHOD = {
  GET: 'get',
  POST: 'post',
  PATCH: 'patch ',
  DELETE: 'delete'
}
// http 响应错误状态码
const STATUS_CODE = {
  400: '参数有误',
  401: '未登录',
  403: '无权访问,请尝试刷新页面或重新登陆',
  404: '请求的数据不存在',
  500: '服务器发生内部错误',
  502: '网关错误',
  503: '服务不可用，服务器暂时过载或维护',
  504: '网关超时'
}
// 创建 axios 实例
const instance = axios.create({
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json'
  }
})
// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    if (sessionStorage.getItem('token')) {
      config.headers.Token = sessionStorage.getItem('token')
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)
// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    if (response.data.msg === '密码错误' || response.data.msg === '没有该用户') {
      Message({
        message:
          response.data.msg,
        type: 'error',
        duration: 5 * 1000
      })
    }
    return response
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    const { response } = error
    if (response.status != null) {
      switch (response.status) {
      // 如果响应码是 401
        case 401:
        // 如果是在登录页面
          if (window.location.pathname === '/login') {
            Message({
              message:
              response.data.message || '登录失败，可能是账号或密码错误！',
              type: 'error',
              duration: 5 * 1000
            })
          } else {
            sessionStorage.removeItem('token')
            MessageBox.confirm('凭证可能已过期，请重新登陆!', '操作失败', {
              confirmButtonText: '登录',
              cancelButtonText: '取消',
              type: 'warning',
              center: true
            }).then(() => {
            // 切换到登录页面
              location.replace('/login')
            })
          }
          break
        default:
          Message({
            message:
            response.data.message || STATUS_CODE[response.status] || '未知错误',
            type: 'error',
            duration: 5 * 1000
          })
      }
    }
    return response
  }
)
/**
 * encodeURI 参数
 *
 * @param {{[x: string]: any}} fields
 */
export function urlencoded (fields) {
  if (!fields) return ''
  const result = Object.keys(fields)
    .filter((it) => !(fields[it] == null || fields[it] === ''))
    .map((key) => {
      let value = fields[key]
      if (typeof value === 'string') {
        value = value.trim()
      }
      if (Array.isArray(value)) { return value.map((v) => `${key}=${encodeURIComponent(v)}`).join('&') }
      return `${key}=${encodeURIComponent(value)}`
    })
  return result.join('&')
}
/**
 * axios 请求
 * @param url 请求地址
 * @param method {METHOD} http method
 * @param params 请求参数
 * @param config 请求选项
 * @returns {Promise<AxiosResponse<T>>}
 */
async function request (url, method, params) {
  switch (method) {
    case METHOD.POST:
      return instance.post(url, params)
    case METHOD.PATCH:
      return instance.patch(url, params)
    case METHOD.DELETE:
      return instance.delete(url)
    case METHOD.PUT:
      return instance.put(url, params)
    default:
      // return instance.get(url)
      // 对 GET 请求的参数要经过编码
      return instance.get(
        url + '/' + params
        // `${Object.keys(params).length > 0 ? '/' + urlencoded(params) : ''}`
      )
  }
}
export { METHOD, request }
